package systemStock;

import java.util.ArrayList;

import org.hibernate.Hibernate;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;




public class ManagerBD {
	
	private Consulta strngQuery;
	
private static SessionFactory sf = new AnnotationConfiguration().configure( "hibernate.cfg.xml").buildSessionFactory();
	


	public ManagerBD() {this.strngQuery = new Consulta();}

 
	public void guardar(Object user) {
		// TODO Auto-generated method stub
		Session sesion = sf.openSession();
		Transaction tx = null;;
		try {
			//Prueba para guardar objetos
			//System.out.println("valores: "+((Articulo) user).getCodArticulo()+" "+((Articulo) user).getDescripcion()+" "+((Articulo) user).getCantidad());
			tx = sesion.beginTransaction();
			sesion.save(user);
			tx.commit();
		} catch (Exception e) {
			tx.rollback();
		} finally {
			sesion.close();
		}	
	}


	@SuppressWarnings({ "unchecked", "deprecation" })
	public ArrayList<Object> listarArticulo(String tabla) {
		// TODO Auto-generated method stub
		ArrayList<Object> usuarios = new ArrayList<Object>();
		
		String aux;
		String aux2;
		
		switch(tabla.charAt(0))

		{ case 'a': 
			 aux = strngQuery.getFromArticulo();
			 aux2 = strngQuery.getCodArt(); 
			break;

		  case 'c': 
			  aux = strngQuery.getFromCategoria();
			  aux2 = strngQuery.getNombre();
			  ;break;
		  case 'm': 
			  aux = strngQuery.getFromMarca();
			  aux2 = strngQuery.getNombre();
			  ;break;
		  case 't': 
			  aux = strngQuery.getFromTalle();
			  aux2 = strngQuery.getTalle();
			  ;break; 
		
		default: aux=""; aux2="";
		}; 

		Session sesion = sf.openSession();
		Transaction tx = null;
		try {
			tx = sesion.beginTransaction();
			usuarios = (ArrayList<Object>) ((SQLQuery) sesion.createQuery(aux)).addScalar(aux2, Hibernate.STRING).list();
			
			tx.commit();
		} catch (Exception e) {
			tx.rollback();
		} finally {
			sesion.close();
		}
		return usuarios;
	}	
	
	
	public boolean existeTalle (String buscado){
		Talle resultado = new Talle();
		resultado = buscarUnaTalle(buscado);
		System.out.println("Objeto Talle------------------>>>>>>>>>>>>>>>>>>"+resultado.getTalle());
		return (resultado!=null);
	}
	
	public boolean existeCategoria (String buscado){
		Categoria resultado = new Categoria();
		resultado = buscarUnaCategoria(buscado);
		System.out.println("Objeto Talle------------------>>>>>>>>>>>>>>>>>>"+resultado.getNombre());
		return (resultado!=null);
	}
	
	public boolean existeMarca (String buscado){
		Marca resultado = new Marca();
		resultado = buscarUnaMarca(buscado);
		System.out.println("Objeto Talle------------------>>>>>>>>>>>>>>>>>>"+resultado.getNombre());
		return (resultado!=null);
	}
	
	
//	
//	 
//	public ArrayList<Object> buscarArtPorTablas( long buscado, String tabla){
//		ArrayList<Object> resultado = new ArrayList<Object>();
//		String aux;
//		switch(tabla.charAt(0))
//
//		{ 
////		  case 'a': 
////			 aux = strngQuery.getFromArticulo();
////			  
////			break;
//
//		  case 'c': 
//			  aux = strngQuery.getTodosLosQueContentaganUnaCategoria();
//			 
//			  ;break;
//		  case 'm': 
//			  aux = strngQuery.getTodosLosQueContentaganUnaMarca();
//			  
//			  ;break;
//		  case 't': 
//			  aux =strngQuery.getTodosLosQueContentaganUnTalle();
//			  
//			  ;break; 
//		
//		default: aux=""; 
//		}; 
//		
//		Session sesion = sf.openSession();
//		Transaction tx = null;
//		
//				
//		try {
//			
//			tx = sesion.beginTransaction();
//			resultado = (ArrayList<Object>) ((SQLQuery) sesion.createQuery("SELECT codArticulo, descripcion, idMarca, cantidad, idCategoria, talle FROM Articulo as u "+aux).setLong("buscado", buscado)).list();
//			System.out.println("Entrooooooooo  ");
//			System.out.println("tx commit");
//			tx.commit();
//
//			System.out.println(" Entro al try");
//			System.out.println(" Valor de resultado : ");
//			
//			} catch (Exception e) {
//			tx.rollback();
//		} finally {
//			sesion.close();
//		}
//		
//		return resultado;
//	}
//	
//	
//	public ArrayList<Object> buscarNombre (String consulta, String buscado){
//		ArrayList<Object> resultado = new ArrayList<Object>();
//		Session sesion = sf.openSession();
//		Transaction tx = null;
//		String aux;
//		String aux2;
//		
//		switch(consulta.charAt(0))
//
//		{ case 'c': 
//			 aux = strngQuery.getFromCategoriaWhereIdCat();
//			 System.out.println("------------ "+aux);
//			 aux2 = strngQuery.getIdCat(); 
//			break;
//
//		  case 'm': 
//			  
//			  aux = strngQuery.getFromMarcaWhereIdMarc();
//			  aux2 = strngQuery.getIdMarca();
//			  ;break;
//		  case 't': 
//			  
//			  aux = strngQuery.getFromTalleWhereTalle();
//			  aux2 = strngQuery.getIdTalle();
//			  ;break; 
//		  
//		default: aux=""; aux2="";
//		}; 
//		
//		try {
//			
//			tx = sesion.beginTransaction();
//			resultado = (ArrayList<Object>) ((SQLQuery) sesion.createQuery(aux).setString("buscado", buscado)).addScalar(aux2, Hibernate.LONG).list();
//			System.out.println("Entrooooooooo  ");
//			System.out.println("tx commit");
//			tx.commit();
//			System.out.println(resultado);
//			System.out.println(" Entro al try");
//			System.out.println(" Valor de resultado : "+resultado.size());
//			
//			} catch (Exception e) {
//			tx.rollback();
//		} finally {
//			sesion.close();
//		}
//		
//		return resultado;
//	}
//	
	public ArrayList<Object> consultaCompuesta( String articulo,long marca,long categoria, long talle){
		ArrayList<Object> resultado = new ArrayList<Object>();
		String aux="";
		if(categoria==0 && talle==0)
			aux=strngQuery.getCompuestaArtMarc();
		else
			if(marca==0 && talle==0)
				aux=strngQuery.getCompuestaArtCat();
			else
				if(marca==0 && categoria==0)
					aux=strngQuery.getCompuestaArtTall();
				else
					if(articulo==null && marca==0)
						aux=strngQuery.getCompuestaCatTall();
					else 
						if(articulo==null && talle==0)
							aux=strngQuery.getCompuestaCatMarc();
						else
							if(articulo==null && categoria==0)
								aux=strngQuery.getCompuestaMarcTall();
							else
								if(talle==0)
									aux=strngQuery.getCompuestaArtCatMarc();
								else
									if(marca==0)
										aux=strngQuery.getCompuestaArtCatTall();
									else
										if(categoria==0)
											aux=strngQuery.getCompuestaArtMarcTall();
										else
											if(articulo==null)
												aux=strngQuery.getCompuestaCatMarcTall();

		
		Session sesion = sf.openSession();
		Transaction tx = null;
		
				
		try {
			
			tx = sesion.beginTransaction();
			resultado = (ArrayList<Object>) ((SQLQuery) sesion.createQuery("FROM Articulo as u "+aux).setString("buscado",articulo).setLong("buscado1", categoria).setLong("buscado2", marca).setLong("buscado3", talle)).list();
			System.out.println("Entrooooooooo  ");
			System.out.println("tx commit");
			tx.commit();

			System.out.println(" Entro al try");
			System.out.println(" Valor de resultado : ");
			
			} catch (Exception e) {
			tx.rollback();
		} finally {
			sesion.close();
		}
		
		return resultado;
	}
	
	
	//------------------>>>>>>>>>>>>>>>>>>>>>>> Buscar un elemento
	public Categoria buscarUnaCategoria(String buscado){
		Object s = null;
		Session sesion = sf.openSession();
		Transaction tx = null;
		try {
			tx = sesion.beginTransaction();			
			 s =  sesion.createQuery(strngQuery.getFromCategoriaWhereIdCat()).setString("buscado", buscado).uniqueResult();

			tx.commit();
		} catch (Exception e) {

			System.out.println("error buscar categoria: " + e);
			tx.rollback();
		} finally {
			sesion.close();
		}
		return (Categoria) s;
	}
	
	public Talle buscarUnaTalle(String buscado){
		Object s = null;
		Session sesion = sf.openSession();
		Transaction tx = null;
		try {
			tx = sesion.beginTransaction();			
			 s =  sesion.createQuery(strngQuery.getFromTalleWhereTalle()).setString("buscado", buscado).uniqueResult();

			tx.commit();
		} catch (Exception e) {

			System.out.println("error buscar talle: " + e);
			tx.rollback();
		} finally {
			sesion.close();
		}
		return (Talle) s;
	}
	
	public Marca buscarUnaMarca(String buscado){
		Object s = null;
		Session sesion = sf.openSession();
		Transaction tx = null;
		try {
			tx = sesion.beginTransaction();			
			 s =  sesion.createQuery(strngQuery.getFromMarcaWhereIdMarc()).setString("buscado", buscado).uniqueResult();

			tx.commit();
		} catch (Exception e) {

			System.out.println("error buscar persona: " + e);
			tx.rollback();
		} finally {
			sesion.close();
		}
		return (Marca) s;
	}
	
}
